package com.example.shuiyin.service;

import com.example.shuiyin.dto.AuthResponse;
import com.example.shuiyin.dto.BindPhoneRequest;
import com.example.shuiyin.dto.LoginRequest;
import com.example.shuiyin.dto.RegisterRequest;
import com.example.shuiyin.dto.WxLoginRequest;
import com.example.shuiyin.entity.User;
import com.example.shuiyin.dto.auth.UserInfoResponse;
import com.example.shuiyin.dto.auth.UserUpdateRequest;
import com.example.shuiyin.dto.ChangePasswordRequest;

public interface AuthService {
    /**
     * 微信登录
     * @param request 登录请求
     * @return 认证响应
     */
    AuthResponse wxLogin(WxLoginRequest request);
    
    /**
     * 绑定手机号
     * @param userId 用户ID
     * @param request 绑定请求
     * @return 认证响应
     */
    AuthResponse bindPhone(Long userId, BindPhoneRequest request);
    
    /**
     * 用户注册
     * @param request 注册请求
     * @return 认证响应
     */
    AuthResponse register(RegisterRequest request);
    
    /**
     * 用户登录
     * @param request 登录请求
     * @return 认证响应
     */
    AuthResponse login(LoginRequest request);
    
    /**
     * 用户登出
     * @param userId 用户ID
     */
    void logout(Long userId);
    
    /**
     * 发送密码重置邮件
     * @param email 用户邮箱
     */
    void sendPasswordResetEmail(String email);
    
    /**
     * 重置密码
     * @param token 重置令牌
     * @param password 新密码
     */
    void resetPassword(String token, String password);
    
    /**
     * 根据ID获取用户
     * @param userId 用户ID
     * @return 用户信息
     */
    User getUserById(Long userId);
    
    /**
     * 获取当前登录用户
     * @return 用户信息
     */
    User getCurrentUser();
    
    /**
     * 获取JWT令牌提供者
     * @return JWT令牌提供者
     */
    com.example.shuiyin.security.JwtTokenProvider getTokenProvider();
    
    /**
     * 根据token获取用户
     * @param token JWT令牌
     * @return 用户信息
     */
    User getUserByToken(String token);
    
    /**
     * 验证JWT token是否有效
     * @param token JWT令牌
     * @return 是否有效
     */
    boolean validateUserToken(String token);

    /**
     * 获取用户信息
     */
    UserInfoResponse getUserInfo(Long userId);

    /**
     * 更新用户信息
     */
    UserInfoResponse updateUserInfo(Long userId, UserUpdateRequest request);

    /**
     * 修改密码
     * @param userId 用户ID
     * @param request 包含旧密码和新密码的请求
     * @return 是否修改成功
     */
    boolean changePassword(Long userId, ChangePasswordRequest request);

    /**
     * 检查用户是否为管理员
     * @param userId 用户ID
     * @return 如果是管理员则返回true，否则返回false
     */
    boolean isAdmin(Long userId);

    /**
     * 管理员重置用户密码
     * @param userId 用户ID
     * @param newPassword 新密码
     * @return 是否重置成功
     */
    boolean adminResetUserPassword(Long userId, String newPassword);
}